/*
 * Copyright (c) 2024 endless-sky
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <string>
#include <vector>
#include <mutex>
#include <optional>
#include "nlohmann/json.hpp"
#include "file_manager.h" // 用于 FileInfo 和 FileType
#include "utils_noncopyable.h"

namespace El {
namespace FileManager {

// 管理单个索引文件（例如，presets.json 或 user.json）
class FileIndex {
    DISALLOW_COPY_AND_MOVE(FileIndex);

public:
    explicit FileIndex(std::string indexFilePath);
    ~FileIndex() = default;

    // 初始化索引（从文件加载或创建新的）
    bool Initialize();

    // 将文件信息添加到此索引
    bool AddFileInfo(const FileInfo &fileInfo);

    // 更新此索引中的文件信息
    bool UpdateFileInfo(const FileInfo &fileInfo);

    // 根据 ID从此索引获取文件信息
    bool GetFileInfo(const std::string &fileId, FileInfo &outInfo);

    // 从此索引获取文件列表，按类型和删除状态过滤
    std::vector<FileInfo> GetFileList(FileType type, bool includeDeleted);

    // 在此索引中将文件标记为已删除
    bool MarkFileAsDeleted(const std::string &fileId);

    // 在此索引中恢复已删除的文件
    bool RestoreDeletedFile(const std::string &fileId);

    // 从此索引中移除文件信息
    bool RemoveFileInfo(const std::string &fileId);

    // 扫描目录并将文件填充到此索引，指定它们的来源
    bool ScanFiles(const std::string &directory, const std::string &origin);

private:
    // 从文件加载索引数据
    bool LoadIndex();

    // 将索引数据保存到文件
    bool SaveIndex();

    // 检查加载的 JSON 数据的完整性
    bool CheckIndexIntegrity(const nlohmann::json &indexData);

    // 生成唯一 ID（静态辅助方法）
    static std::string GenerateUniqueId();

    // 从路径猜测文件类型（静态辅助方法）
    static std::string GuessFileType(const std::string &filePath);

private:
    std::string indexFilePath_;
    nlohmann::json indexData_;
    std::mutex mutex_;
};

} // namespace FileManager
} // namespace El